//
//  UIButton+HNActivity.m
//  优学荟管理系统
//
//  Created by edz on 2017/11/14.
//  Copyright © 2017年 星道三好. All rights reserved.
//

#import "UIButton+HNActivity.h"
#import <objc/runtime.h>

@implementation UIButton (HNActivity)

/** 增加菊花并开始动画，文字暂时隐藏 */
- (void)BeginAnimationForActivity {
    
    // 1、准备
    // 保存按钮的文字
    self.Title = self.currentTitle;
    // 如果菊花存在就删了先
    [self.Activity removeFromSuperview];
    // 消除野指针
    self.Activity = nil;
    
    // 2、菊花过程
    // 建立菊花
    self.Activity = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:(UIActivityIndicatorViewStyleGray)];
    // 开始动画
    [self.Activity startAnimating];
    // 设置停止就隐藏
    [self.Activity setHidesWhenStopped:YES];
    // 添加
    [self addSubview:self.Activity];
    // 位置
    [self.Activity mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerX.equalTo(self);
        make.centerY.equalTo(self);
    }];
    
    // 3、按钮
    // 关闭文字
    [self setTitle:@"" forState:self.state];
    // 交互不允许,用enabled可以使背景虚化
    self.enabled = NO;
}

/** 关闭并使一切恢复正常 */
- (void)CloseAnimationForActivity {
    
    // 1、按钮
    // 文字恢复
    [self setTitle:self.Title forState:self.state];
    // 交互恢复
    self.enabled = YES;
    
    // 2、菊花与文字
    // 消除
    [self.Activity removeFromSuperview];
    self.Activity = nil;
    self.Title = nil;
    
}

/** 该按钮消失的时候，将全局变量手动消除 */
- (void)removeFromSuperview {
    
    self.Title = nil;
    [self.Activity removeFromSuperview];
    self.Activity = nil;
    [super removeFromSuperview];
}






#pragma mark - Set、Get
/*
 objc_AssociationPolicy参数使用的策略：
 OBJC_ASSOCIATION_ASSIGN;            //assign策略
 OBJC_ASSOCIATION_COPY_NONATOMIC;    //copy策略
 OBJC_ASSOCIATION_RETAIN_NONATOMIC;  // retain策略
 
 OBJC_ASSOCIATION_RETAIN;
 OBJC_ASSOCIATION_COPY;
 */
/*
 关联方法：
 objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);
 
 参数：
 * id object 给哪个对象的属性赋值
 const void *key 属性对应的key
 id value  设置属性值为value
 objc_AssociationPolicy policy  使用的策略，是一个枚举值，和copy，retain，assign是一样的，手机开发一般都选择NONATOMIC
 */
//定义常量 必须是C语言字符串
// 文字
static void *TitleKey = &TitleKey;
- (void)setTitle:(NSString *)Title {
    
    objc_setAssociatedObject(self, TitleKey, Title, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)Title {
    
    return objc_getAssociatedObject(self, TitleKey);
}


// 菊花
static void *ActivityKey = &ActivityKey;
- (void)setActivity:(UIActivityIndicatorView *)Activity {
    
    objc_setAssociatedObject(self, ActivityKey, Activity, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (UIActivityIndicatorView *)Activity {
    
    return objc_getAssociatedObject(self, ActivityKey);
}
@end
